4.4.2. 减法
减法结合了两种熟悉的运算:求反和加法。换句话说,减去 7 - 3 相当于将运算表示为 7 + (-3)。这种减法的描述与硬件的行为方式非常吻合——CPU 已经包含用于求反和加法的电路,因此重用这些电路而不是构建一个全新的减法器是有意义的。回想一下,对二进制数求反的一个简单过程是取反并加一。
考虑示例 0b0111 (7) - 0b0011 (3),它首先将 3 发送到位翻转电路。为了获得“加一”,它利用了加法器电路的进位。也就是说,减法不是将一个数字传送到另一个数字,而是将 进位 传送给加法器的 d0。将进位设置为 1 会将所得的“个位”值增加 1,这正是获得求反的“加一”部分所需的值。将所有内容放在一起,该示例将如下所示:
Problem Setup | Converted to Addition | Worked Example |
---|---|---|
   0111 - 0011 |          1 (carry in)    0111 + 1100 (bits flipped) |          1 (carry in)    0111 + 1100 (bits flipped) Result: 0100 Carry out: 1 |
虽然加法的完整结果会带入一个额外的数字,但截断的结果 (0b0100) 表示预期结果 (4)。与前面的加法示例不同,从高位进位不一定表示减法存在溢出问题。
在减去负值时,先执行减法,然后执行加法也有效。例如,7 - (-3) 产生 10:
Problem Setup | Converted to Addition | Worked Example |
---|---|---|
   0111 - 1101 |          1 (carry in)     0111 + 0010 (bits flipped) |          1 (carry in)     0111 + 0010 (bits flipped) Result: 1010 Carry out: 0 |
我们进一步探讨在4.5 数字溢出中执行(或不执行)的含义。